home *** CD-ROM | disk | FTP | other *** search
/ Aminet 5 / Aminet 5 - March 1995.iso / Aminet / dev / misc / LEDA_gene.lha / LEDA-3.1c-generic / incl / LEDA / impl / pers_tree.h < prev    next >
Encoding:
C/C++ Source or Header  |  1994-08-05  |  5.7 KB  |  235 lines

  1. /*******************************************************************************
  2. +
  3. +  LEDA  3.1c
  4. +
  5. +
  6. +  pers_tree.h
  7. +
  8. +
  9. +  Copyright (c) 1994  by  Max-Planck-Institut fuer Informatik
  10. +  Im Stadtwald, 6600 Saarbruecken, FRG     
  11. +  All rights reserved.
  12. *******************************************************************************/
  13.  
  14.  
  15. #ifndef LEDA_PERS_TREE_H
  16. #define LEDA_PERS_TREE_H
  17.  
  18. #include <LEDA/basic.h>
  19. #include <LEDA/list.h>
  20.  
  21. typedef void (*DRAW_NODE_FCT)(double,double,void*);
  22. typedef void (*DRAW_EDGE_FCT)(double,double,double,double);
  23.  
  24. /* implementation of a node of the ephemeral red-black tree of a specific
  25.  * persistent  node, where the colors of that persistent node through the
  26.  * various versions can be found
  27.  */
  28.  
  29. class pers_tree_node;
  30. class C_pers_tree_node;
  31. class F_pers_tree_node;
  32. class VER_pers_tree_node;
  33.  
  34. typedef list_item Version;
  35.  
  36.  
  37. class C_pers_tree_node
  38. {
  39.   friend class pers_rb_tree;
  40.  
  41.   Version vers_stamp;
  42.   C_pers_tree_node* c_link[3];
  43.   int c_right;
  44.   int c_color;
  45.   int col_value;
  46.  
  47.   LEDA_MEMORY(C_pers_tree_node)
  48. };
  49.  
  50. /* implementation of a node of the  ephemeral red-black tree of a specific
  51.  * persistent node, where the children of that persistent node through the
  52.  * various versions can be found
  53.  */
  54.  
  55. class F_pers_tree_node
  56. {
  57.   friend class pers_rb_tree;
  58.  
  59.   Version ver_stamp;
  60.   F_pers_tree_node* f_link[3];
  61.   int f_right;
  62.   int f_color;
  63.   pers_tree_node* poin_value;
  64.  
  65.   LEDA_MEMORY(F_pers_tree_node)
  66. };
  67.  
  68.  
  69. /* implementation of a persistent node */
  70.  
  71. class pers_tree_node
  72. {
  73.   friend class pers_rb_tree;
  74.  
  75.   void *key;
  76.   void *info;
  77.   pers_tree_node *parent;
  78.   int right;
  79.   int is_leaf;
  80.   F_pers_tree_node *link[2];
  81.   C_pers_tree_node *red;
  82.   F_pers_tree_node *copy;
  83.  
  84.   pers_tree_node* next;  // linking all used pers_tree_nodeS
  85.  
  86.   LEDA_MEMORY(pers_tree_node)
  87. };
  88.  
  89. /* implementation of a node (or member) of the version list */
  90.  
  91. class VER_pers_tree_node
  92.   friend class pers_rb_tree;
  93.  
  94.   pers_tree_node*  acc_pointer;
  95.   int    popul;
  96.   double ser_num;
  97.  
  98.   LEDA_MEMORY(VER_pers_tree_node)
  99. };
  100.  
  101. typedef VER_pers_tree_node* ver_node;
  102.  
  103.  
  104.  
  105. struct V_LIST {
  106.  
  107. list<ver_node> vl;
  108. int count;
  109. pers_tree_node* used;
  110.  
  111. };
  112.  
  113.  
  114.  
  115. class pers_rb_tree {
  116.  
  117. protected:
  118.  
  119. V_LIST* v_list;
  120.  
  121. virtual int cmp_keys(GenPtr x, GenPtr y) { return compare(x,y); }
  122. virtual void print_key(GenPtr x) { Print(x); }
  123. virtual void copy_key(GenPtr&)   {}
  124. virtual void copy_inf(GenPtr&)   {}
  125. virtual void clear_key(GenPtr&)  {}
  126. virtual void clear_inf(GenPtr&)  {}
  127.  
  128.  
  129. pers_tree_node* child(int leftright, pers_tree_node *p, Version i)
  130. { return(acc_step(p->link[leftright], i)); }
  131.  
  132. void* get_key(pers_tree_node *p, Version i)
  133. { return (acc_step(p->copy, i))->key; }
  134.  
  135. int isleaf(pers_tree_node *p) 
  136. { //return (p == p->link[0]->poin_value); 
  137.   return p->is_leaf;
  138.  }
  139.   
  140. pers_tree_node* sibling(pers_tree_node *p, Version i)
  141. { return acc_step(p->parent->link[1 - p->right], i); } 
  142.  
  143.  
  144. /* define the order of versions in the version list */
  145. int vless(Version x, Version y)    
  146. { return  (v_list->vl[x]->ser_num < v_list->vl[y]->ser_num); }
  147.  
  148. /* find the next to a given version in the version list */ 
  149. Version  iplus(Version i)
  150. { return v_list->vl.succ(i); }
  151.  
  152.  
  153. pers_tree_node*   acc_step(F_pers_tree_node *, Version);
  154. Version new_version(Version);
  155. void    m_b_root(Version);
  156.  
  157. F_pers_tree_node* f_nleaf(pers_tree_node*, Version);
  158. F_pers_tree_node* f_nnode(F_pers_tree_node*, F_pers_tree_node*);
  159. F_pers_tree_node* f_rbsearch(F_pers_tree_node* p, Version);
  160. void    f_rbclear(F_pers_tree_node*);
  161. int     f_insert(F_pers_tree_node*, pers_tree_node*, Version);
  162. void    f_single_rot(F_pers_tree_node*, int);
  163. void    f_double_rot(F_pers_tree_node*, int);
  164.  
  165. C_pers_tree_node* c_nleaf(int, Version);
  166. C_pers_tree_node* c_nnode(C_pers_tree_node*, C_pers_tree_node*);
  167. C_pers_tree_node* c_rbsearch(C_pers_tree_node* p, Version);
  168. void    c_rbclear(C_pers_tree_node*);
  169. int     c_insert(C_pers_tree_node*, int, Version);
  170. void    c_single_rot(C_pers_tree_node*, int);
  171. void    c_double_rot(C_pers_tree_node*, int);
  172.  
  173. pers_tree_node*   single_rot(pers_tree_node* top_node, int dir, Version i);
  174. pers_tree_node*   double_rot(pers_tree_node* top_node, int dir, Version i);
  175. pers_tree_node*   newnode(pers_tree_node* c1, pers_tree_node* c2, Version i);
  176. pers_tree_node*   newleaf(void* val, void* inf, pers_tree_node*, pers_tree_node*, Version i);
  177. int     isred(pers_tree_node* p, Version i);
  178. void    up_col(C_pers_tree_node* p, int newvalue, Version i);
  179. void    update(F_pers_tree_node* p, pers_tree_node* newvalue, Version i);
  180.  
  181. pers_tree_node*   search(void* val, Version i)     { pers_tree_node* p; return search(val,p,i);}
  182. pers_tree_node*   search(void*, pers_tree_node*&, Version);
  183.  
  184.  
  185. public:
  186.  
  187.  pers_rb_tree() {}
  188. virtual ~pers_rb_tree() {}
  189.  
  190. void init_tree();
  191.  
  192. void* key(pers_tree_node* p)  { return p->key; }
  193. void* inf(pers_tree_node* p)  { return p->info; }
  194.  
  195. Version copy_version(Version);
  196. void    del_version(Version);
  197.  
  198. Version del(void*, Version);
  199. Version insert(void*, void*, Version);
  200. Version change_inf(pers_tree_node*,void*,Version);
  201.  
  202. pers_tree_node* lookup(void *val,Version v);
  203. pers_tree_node* locate(void *val,Version v);
  204. pers_tree_node* locate_pred(void *val,Version v);
  205. pers_tree_node* min(Version v);
  206. pers_tree_node* max(Version v);
  207. pers_tree_node* succ(pers_tree_node* p, Version v) { return child(1,p,v); }
  208. pers_tree_node* pred(pers_tree_node* p, Version v) { return child(0,p,v); }
  209.  
  210. int   size(Version v) { return v_list->vl[v]->popul; }
  211.  
  212. double ver_num(Version v)  { return v_list->vl[v]->ser_num; }
  213.  
  214. void print(pers_tree_node*,Version);
  215.  
  216. void del_tree();
  217.  
  218. void print(Version v) 
  219. { //cout << form("%5f : ",v_list->vl[v]->ser_num);
  220.   print(v_list->vl[v]->acc_pointer,v);
  221.   newline;
  222.  }
  223.  
  224. void draw(DRAW_NODE_FCT,DRAW_EDGE_FCT, Version, pers_tree_node*, double, double, double, double, double);
  225.  
  226. void draw(DRAW_NODE_FCT,DRAW_EDGE_FCT, Version, double, double, double, double);
  227.  
  228. };
  229.  
  230.  
  231. #endif
  232.  
  233.